from ftplib import FTP 
import os
import time

'''
显示FTP当前路径函数
'''
def pwd_report(ftp):
    msg = ftp.pwd()  
    print(f'当前位置 {msg}')
    return msg

'''
FTP下载文件函数
输入 ftp--ftp类型变量 filename--下载的文件名
'''
def download(ftp, filename):
    current_cwd = os.getcwd()
    os.chdir('tm_ycdat')
    print(f'遥测文件{filename}下载开始')
    
    bufsize = 1048576  #设置缓冲块大小
    with open(filename, 'wb') as g:
        def write_callback(dat):  # 临时回调函数 用于记录读入多少字节
            g.write(dat)
            print(f'已下载{len(dat)}字节')
        
        # ftp.retrbinary(f'RETR {filename}', g.write, bufsize)
        ftp.retrbinary(f'RETR {filename}', write_callback, bufsize)
        
    print(f'遥测源码文件{filename}下载完成')    
    os.chdir(current_cwd)

'''
FTP下载主函数 完成连接 下载和文件保存
输入 ftp_param--FTP参数字典
'''
def yc_ftp(ftp_param):
    with FTP(ftp_param['IP']) as ftp:
        ftp.login(ftp_param['user'], ftp_param['pwd'])
        print(ftp.getwelcome())
        pwd_report(ftp)
        
        print(f"需要下载{len(ftp_param['ycpath'])}个目录中的文件")
        for ycdir in ftp_param['ycpath']:
            ftp.cwd(f"\\DQ1\\{ycdir}\\SatYC")
            msg = pwd_report(ftp)
            
            file_list = ftp.nlst()
            
            print(f"目录{msg}下有{len(file_list)}个文件")
            for fname in file_list:
                fsize = ftp.size(fname)
                print(f'文件{fname}大小{round(fsize/1e6,2)}MB')
                time.sleep(2)
                download(ftp, fname)



if __name__ == '__main__':
    # 文件服务器参数
    ftp_para = {
        'IP': '218.247.138.118',
        'port': 21,
        'user': 'GF5B_509',
        'pwd': '509gf5b',
        'ycpath':['20220503','20220504']
}
    
    yc_ftp(ftp_para)
    
    